const Bundler = require('parcel-bundler');
const Path = require('path');
const fs = require('fs');

// 导入基本配置
const config = require('./base.js');

// 使用提供的入口文件路径和选项初始化 bundler
const bundler = new Bundler(config.entry, config.options);

// 错误处理
bundler.on('buildError', error => {
    console.error(`编译错误: 文件 ${error.fileName} 错误类型 ${error.name} ${error.message}`)
});

// 清理输出目录
const dir = Path.join(__dirname, `.${config.options.outDir}`);
var clearDir = function (dir) {
    return new Promise(function (resolve, reject) {
        // 目录不存在无需清理
        if (!fs.existsSync(dir)) resolve(`✈  目录不存在无需清理 ${dir}`);
        !(function (directory) {
            let files = [];
            if (fs.existsSync(directory)) {
                files = fs.readdirSync(directory);
                files.forEach((file, index) => {
                    let curPath = directory + "/" + file;
                    if (fs.statSync(curPath).isDirectory()) {
                        // delDir(curPath); //递归删除文件夹
                        arguments.callee(curPath);
                    } else {
                        fs.unlinkSync(curPath); //删除文件
                    }
                });
                if (directory === dir) { // 删除outDir目录
                    fs.rmdirSync(directory) === void 0 && resolve(`✈  目录清理完成 ${dir}`);
                } else {
                    fs.rmdirSync(directory); // 删除成功返回undefined
                }
            }
        })(dir);
    })
}

clearDir(dir).then(function (resolve) {
    console.log(resolve);
    bundler.on('buildEnd', () => {
        console.log(`✈  打包完成 ${dir}`);
    });
    // 输出文件
    bundler.bundle();
})

// 运行 bundler，这将返回主 bundle
// 如果你正在使用监听模式，请使用下面这些事件，这是因为该 promise 只会触发一次，而不是每次重新构建时都触发
// const bundle = await bundler.bundle();